注意:所有文章除特别说明外,转载请注明出处.
[TOC]
多线程与并发 - 面试
如何实现处理线程的返回值
1.主线程等待法
2.Thread类的join()阻塞当前线程以等待子线程处理完毕
3.通过Callable接口实现,通过 FutureTask 或 线程池获取
sleep()方法与wait()方法区别
1.sleep()是Threadk类的方法,wait()是Object类中定义的方法
2.sleep()方法可以在任意地方使用
3.wait()方法只能在synchronized方法或synchronized块中使用
最主要本地区别:
1.Thread.sleep()只会让出CPU,不会导致锁行为的改变
2.Object.wait()不仅让出CPU,还会释放已经占有的同步资源锁
synchronized
1.互斥性
2.可见性
注意:synchronized锁的不是代码,锁的都是对象
分类:
1.获取对象锁
1.同步代码块
2.同步非静态方法
2.获取类锁
1.同步代码块
2.同步静态方法
总结:对象锁和类锁
1.有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块
2.若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块会被阻塞
3....
J.U.C知识点
java.util.concurrent,提供并发编程的解决方案。
1.CAS是java.util.concurrent.atomic包的基础
2.AQS是java.util.concurrent.locks包以及一些常用类如:Semophore ReentrantLock等类的基础
J.U.C包的分类
1.线程执行器executor
2.锁locks
3.原子变量类atomic
4.并发工具类tools
1.闭锁 CountDownLatch
内部有一个计数器(cnt),每调用一次则减1,直到为0之后回到主线程继续
让主线程等待一组事件发生后继续执行,而这里的事件是指CountDownLatch里的countDown()方法
2.栅栏 CyclicBarrier
内部有一个计数器(cnt),每调用一次则减1,直到为0之后回到主线程继续
阻塞当前线程,等待其它线程,所有线程必须同时到达栅栏位置后,才能继续执行
所有线程到达栅栏处,可以触发执行另外一个预先设置的线程
3.信号量Semaphore
控制某个资源可以同时被访问的线程个数
4.交换器 Exchanger
两个线程到达同步点后,相互交换数据
注意:Exchanger只能作用于两个线程
5.并发集合collections
BlockingQueue 提供可阻塞的入队和出队操作,主要用于生产者和消费者模式,在多线程场景下生产者线程在队尾添加元素,而消费者在队列头部消费元素,通过此种方式能够达到将任务的生产和消费进行隔离。
线程安全:
1.ArrayBlockingQueue 一个由数组结构组成的有界阻塞队列
2.LinkedBlockingQueue 一个由链表结构组成的有界/无界阻塞队列
3.PriorityBlockingQueue 一个支持优先级排序的无界阻塞队列
...
Java的IO机制
问题1:Java BIO NIO AIO的区别
BIO (Block IO) 表示传统的IO:传统的InputStream OutputStream Reader Writer,该模式是基于流模式实现的
NonBlock-IO(NIO) 构建多路复用的、同步非阻塞的IO操作